/*
 * @Author: yuluo
 * @Date: 2025-08-28
 * @LastEditors: yuluo
 * @LastEditTime: 2025-10-10
 * @FilePath: \Projecte:\gitee\GD32F427\gd32-f427-BootLoader\Libraries\SYSTEM\include\usart.h
 * @Description:
 * 如有特殊注意事项请填写
 * Copyright (c) by ${yuluo}, All Rights Reserved.
 */
/************************************************
 * 串口初始化代码(一般是串口0)，支持printf
 ************************************************/

#ifndef __USART_H
#define __USART_H

#include "stdio.h"
#include "sys.h"

#define USART_REC_LEN 2048 /* 定义最大接收字节数 200 */
#define USART_SEND_LEN 64 /* 定义最大发送字节数 64 */
#define USART_EN_RX 1     /* 使能（1）/禁止（0）串口0接收 */

#define RECV_SIZE 1024 /* 每次接收数据的大小 */

#define FRAME_HEAD1 0xAA
#define FRAME_HEAD2 0x55
#define FRAME_TAIL1 0x55
#define FRAME_TAIL2 0xAA

/* 接收的功能码 */
#define FUNC_CODE_VERSION 0x81
#define FUNC_CODE_FIRMWAREINFO 0x82
#define FUNC_CODE_ERASE 0x83
#define FUNC_CODE_FIRMWAREDATA 0x84

/* 应答码 */
#define FUNC_ACK_VERSION 0xF1
#define FUNC_ACK_FIRMWAREINFO 0xF2
#define FUNC_ACK_ERASE 0xF3
#define FUNC_ACK_ERASEDONE 0xF4
#define FUNC_ACK_FIRMWAREDATA 0xF5
#define FUNC_ACK_FIRMWARECRCOK 0xF6

typedef struct
{
    uint16_t RxCounter;               /* 接收到的数据长度 */
    uint16_t TxCounter;               /* 发送的数据长度 */
    uint8_t RxBuffer[USART_REC_LEN];  /* 接收缓冲,最大USART_REC_LEN个字节. */
    uint8_t TxBuffer[USART_SEND_LEN]; /* 发送缓冲,最大USART_SEND_LEN个字节. */
    uint8_t RxFlag;                   /* 接收完成标志 */
} sUsart0_t;

typedef struct
{
    uint32_t totalsize;
    uint32_t rev_crc_checksum;
    uint32_t rev_size;
    uint32_t crc_checksum;
    uint32_t flashWriterEnd;
    uint32_t totalLen;
    uint8_t firmwareType;
}sFirmware_t;

extern sFirmware_t sFirmware;
extern sUsart0_t sUsart0;

void usart_init(uint32_t bound);               /* 串口初始化函数 */
void Send_Package(uint8_t *buf, uint16_t len); /* 串口发送一个包数据 */
void Send_Byte(uint8_t data);                  /* 串口发送一个字节 */
int8_t parse_data(uint8_t *buf, uint16_t len); /* 数据解析函数 */

void Make_VersionPacket(void);      /* 组版本信息包 */
void Make_FirmwareInfoPacket(void); /* 组固件信息包 */
void Make_EraseDonePacket(void);    /* 组擦除完成应答包 */
void Make_ErasePacket(void);        /* 组擦除应答包 */
void Make_FirmwareDataPacket(void); /* 组数据应答包 */

static uint8_t hexToByte(const char *hex); /* ASCII转16进制 */
void processHexBlock(const char *buf, int len);  /* 处理一行HEX数据 */

#endif
